/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modbus;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Leandro
 */
public class FabricaPaquetes {

    public static FabricaPaquetes inst;
    

    public static FabricaPaquetes getInst() {
        if (inst == null) {
            inst = new FabricaPaquetes();

        }
        return inst;
    }

    public Paquete getPaqueteSerial(int id, int funcion, int dir, int cantReg, int valuewrite, int[] valores) {
        Paquete p = new Paquete(id, funcion);

        switch (funcion) {
            case 3:
                p.prepareReadRegisters(dir, cantReg);
                break;
            case 6:
                p.prepareWriteSingleRegister(dir, valuewrite);
                break;
            case 16:
                p.prepareWriteMultipleRegisters(dir, cantReg, valores);
                break;
            default:
                break;
        }
        return p;
    }

    public List<Paquete> getPaquetesSerial(int id, int funcion, int dir, int cantReg, int valuewrite, int[] valores) {
        Paquete p = new Paquete(id, funcion);
        List<Paquete> ps = new ArrayList<Paquete>();
        int direccion = dir;
        switch (funcion) {
            case 3:
                if (cantReg > 125) {
                    //Mas de un paquete
                    for (int i = cantReg; i > 0; i -= 125) {
                        p = new Paquete(id, funcion);

                        if (i > 125) {
                            p.prepareReadRegisters(direccion, 125);
                            direccion += 125;
                        } else {
                            p.prepareReadRegisters(direccion, i);
                        }
                        ps.add(p);
                    }
                } else {
                    p.prepareReadRegisters(dir, cantReg);
                    ps.add(p);
                }
                break;
            case 6:
                p.prepareWriteSingleRegister(dir, valuewrite);
                ps.add(p);
                break;
            case 16:
                p.prepareWriteMultipleRegisters(dir, cantReg, valores);
                ps.add(p);
                break;
            default:
                break;
        }
        return ps;
    }
    /**
     * Fabrica un paquete con el formato TCP Mod Bus
     * txID : 2 By, nro autoincremental
     * idProtocolo: 2 By, 0 = MODBUS
     * length: 2 By, N° Bytes que siguen
     * idDisp: 1 By, id del slave
     * @return
     */
    public List<Paquete> getPaquetesTcp(int id, int funcion, int dir, int cantReg, int valuewrite, int[] valores) {
        Paquete p = new Paquete(id, funcion);
        List<Paquete> ps = new ArrayList<Paquete>();
        int direccion = dir;
        switch (funcion) {
            case 3:
                if (cantReg > 125) {
                    //Mas de un paquete
                    for (int i = cantReg; i > 0; i -= 125) {
                        p = new Paquete(id, funcion);
                        if (i > 125) {
                            p.prepareReadRegisters(direccion, 125);
                            direccion += 125;
                        } else {
                            p.prepareReadRegisters(direccion, i);
                        }
                        ps.add(p);
                    }
                } else {
                    p.prepareReadRegisters(dir, cantReg);
                    ps.add(p);
                }
                break;
            case 6:
                p.prepareWriteSingleRegister(dir, valuewrite);
                ps.add(p);
                break;
            case 16:
                p.prepareWriteMultipleRegisters(dir, cantReg, valores);
                ps.add(p);
                break;
            default:
                break;
        }
        return ps;
    }
}
